home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / UTILFILE / OPTIM.LZH / OPTIM.ASM next >
Assembly Source File  |  1987-04-13  |  24KB  |  1,163 lines

  1. NAME    OPTIM
  2. .XLIST
  3. PAGE 105,132
  4. TITLE    Fixed Disk Optimising Program
  5. .LIST
  6. COMMENT *
  7.     Uses High resolution Timer routine to check speed of processes.
  8.     *
  9.  
  10. ;---------------------
  11. ; MACROS
  12. ;---------------------
  13.  
  14. DISPLAY    MACRO            ; Display String @ DS:DX
  15.     MOV    AH,9
  16.     INT    21H
  17.     ENDM
  18.     
  19. HEADSET    MACRO     
  20.     MOV    DL,CS:[DR_ID]
  21.     MOV    DH,0
  22.     MOV    CX,01H
  23.     MOV    AX,21AH
  24.     MOV    BX,OFFSET DTABUF
  25.     INT    13H
  26.     ENDM
  27.  
  28. ;------------------    
  29. ;    EQUATES
  30. ;------------------
  31.  
  32. TIM_LOW        EQU    006CH    ; Location of System Clock
  33. BIOS_DSEG    EQU    0040H    ; Address of BIOS Data segment
  34. TIM_MODE    EQU    43H    ; Control Port Address of 8253-5 chip
  35. TIM_0        EQU    40H    ; Read Port Address of 8253-5
  36.  
  37. ;------------------
  38. ;    CODE
  39. ;------------------
  40.  
  41.     ASSUME    CS:CODE, DS:CODE
  42. CODE    SEGMENT
  43. MAIN    PROC    NEAR
  44.     ORG    100H
  45.     
  46. BEGIN:    JMP    START
  47.  
  48. COUNT        DW    0    ; Interrupt Ticks  54.925 msecs
  49. COUNT_MICRO    DW    0    ; Calculate from COUNT
  50. COUNT_MILLI    DW    0    ; Calculate from COUNT
  51. TIM_MICRO    DW    0    ; From 8253 counter
  52. TIM_MILLI    DW    0    ; Final Value
  53. TIM_SEC        DW    0    ; Final Value
  54.  
  55. TIM1MIC        DW    0    ; Test 1 Microseconds
  56. TIM1MIL        DW    0    ; Test 1 Milliseconds
  57. TIM1SEC        DW    0    ; Test 1 Seconds
  58.  
  59. TIM2MIC        DW    0    ; Test 2 Microseconds
  60. TIM2MIL        DW    0    ; Test 2 Milliseconds
  61. TIM2SEC        DW    0    ; Test 2 Seconds
  62.  
  63. TIM3MIC        DW    0    ; Test 3 Microseconds
  64. TIM3MIL        DW    0    ; Test 3 Milliseconds
  65. TIM3SEC        DW    0    ; Test 3 Seconds
  66.  
  67. TIM4MIC        DW    0    ; Test 4 Microseconds
  68. TIM4MIL        DW    0    ; Test 4 Milliseconds
  69. TIM4SEC        DW    0    ; Test 4 Seconds
  70.  
  71. COUNT_MAX    DW    65535    ; Starting point
  72. ADJUSTM        DW    0    ; Compensating Factor
  73. TIM_CONV    DW    8381    ; 838.096 nsec/tick
  74. COUNT_CONV    DW    54925    ; 54.925 msec/tick
  75. TEN_TH        DW    10000    ; Divisor 1
  76. FIVE_TH        DW    5000    ; Divisor 2
  77. THOU        DW    1000    ; Divisor 3
  78. TEN        DW    10    ; Divisor 4
  79. INTERLEAVE    DB    16    ; Interleave Count
  80. INTLVE        DB    0    ; Optimum Interleave
  81. LOWMIC        DW    0FFFFH
  82. LOWMIL        DW    0FFFFH
  83. LOWSEC        DW    0FFFFH
  84. ANSYN        DB    'YYN',13
  85. ANSCD        DB    'CCD',13
  86. DR_ID        DB    80H
  87.  
  88. ;-------------------
  89. ;  Message Area
  90. ;-------------------
  91. SIGN_ON        DB    '╔══════════════════════════════════════════════════════════════════════════════╗',13
  92.         DB    '║       CUMANA - Fixed Disk Installation and Optimisation - Version 1.20       ║',13
  93.         DB    '║       ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       ║',13
  94.         DB    '║                                                                              ║',13
  95.         DB    '║      This Program is designed to set up a Fixed Disk Unit from scratch.      ║',13
  96.         DB    '║                                                                              ║',13
  97.         DB    '║  Once you have elected to continue, the program will list the settings of    ║',13
  98.         DB    '║  the selected drive.    If you accept these settings as correct,  the        ║',13
  99.         DB    '║  program will then experimentally format  Cylinders 0 and 1 and time the     ║',13
  100.         DB    '║  access for each of 16 interleave values.  Once this process has ended,      ║',13
  101.         DB    '║  the whole disk will be formatted at the optimum interleave setting.         ║',13
  102.         DB    '║  This ensures that Fixed Disk performance will be efficiently matched to     ║',13
  103.         DB    '║  your machine.                                                               ║',13
  104.         DB    '║                                                                              ║',13
  105.         DB    '║  When formatting has been completed, you will be asked to enter details      ║',13
  106.         DB    '║  of defective areas of the disk.  These are usually written on the disk      ║',13
  107.         DB    '║  itself or the relevant documentation.  Make a note of the Cylinders and     ║',13
  108.         DB    '║  Heads involved BEFORE you run the program, so that you don',39,'t need to        ║',13
  109.         DB    '║  move the disk while it is in operation.  Cylinder numbers should be         ║',13
  110.         DB    '║  entered in decimal notation.   UpoN τorre"t C-p,%tdäüâƒΘ>╔┤ôIiê&a7 nM╙Süñß≥$"  ü$*eÅFsW7N&`@êy≡0q    ≤0É@    ±└9≡0q±Ç0@    ≡@0y≡Ç0└æ    ≡@Ç1└01└0@α8╚ÄNC3₧I∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙α8╚ÄNC3₧I∙≡≡æÇë±╔≥I≡q≡@    ±└æ    ≡æ┴0I≡0    ±Ç0@    °∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙αs         ║',13
  111.         DB    '╚══════════════════════════════════════════════════════════════════════════════╝',13,'$'
  112.  
  113. MESS_01        DB    'WARNING !!!  This program will ERASE all data on the selected drive!',13,10
  114.         DB    '║ Do you want to continue?  [N]$'
  115. MESS_AVE    DB    ' $'
  116. MESS_SEC    DB    ' Seconds$'
  117. MESS_MIL    DB    '.$'
  118. MESS_MIC    DB    ' $'
  119. MESS_RUN    DB    'Interleave '
  120. MESS_EQ        DB    '   timed at $'
  121. ASC_STR        DB    5 DUP('d'),'$'
  122. BLANKLINE    DB    '                                                                            $'
  123. LF        DB    13,10,'║ $'
  124. BELL        DB    7,'$'
  125. MESS_OPT0    DB    'Optimising Interleave - $'
  126. MESS_OPT1    DB    'Optimum Interleave is '
  127. MESS_OPT2    DB    '    ',13,10,'║ $'
  128. MESS_OPT3    DB    ' FORMATTING DRIVE '
  129. MESS_OPT4    DB    'C'
  130.         DB    '  with Interleave $'
  131. MESS_OPT5    DB    'Any Bad Tracks to Enter? [N]$'
  132. MESS_OPT6    DB    'Enter Cylinder Number (Decimal) ... $'
  133. MESS_OPT7    DB    'Enter Head Number  ................ $'
  134. MESS_OPT8    DB    'Bad Track Flagged!      Any more Bad Tracks? [N]$'
  135. MESS_OPT9    DB    'Format Completed                         ',13,10,10,'║ $'
  136. MESS_OPT10    DB    'Entering Bad Track information ... ',13,10,'$'
  137. DUFF_CONT    DB    'DISK CONTROLLER ERROR REPORTED!',13,10
  138.         DB    'Please check Controller Cables and Connections.',13,10,'$'
  139. LOG_PART    DB    'The Controller indicates that the Drive is set for LOGICAL PARTIONING ',13,10
  140.         DB    '║ This program cannot handle Logical Formatting - please us the ROM routine.',13,10,10,'$'
  141. SELECT1        DB    'Select Drive to Format (C or D) [C]$'
  142. DR_REPP        DB    'Selected Drive has these Settings ...',13,10,10
  143.         DB    '║ $'
  144. DR_CYL        DB    '      Number of CYLINDERS ... : $'
  145. DR_HDS        DB    '      Number of HEADS ....... : $'
  146. CYLS        DW    00
  147. HDS        DB    0        
  148. ABORT        DB    13,10,'║ Returning to Operating System ...',13,10,'$'
  149. CONTINUE    DB    13,10,'║ Writing Partition Table ...'
  150.         DB    13,10,'║ Rebooting to establish Drive'
  151.         DB    10,10,10,10,10,10,10,10,13,'$'
  152. CONFIRM        DB    'Are these correct? [Y]$'
  153. BADCYL        DB    13,10,'║ Invalid Cylinder Number!$'
  154. BADHD        DB    13,10,'║ Invalid Head Number!$'
  155.         DB    'Author Jim Bates - BATES Associates'
  156.     
  157.     ASSUME    CS:CODE, DS:CODE, ES:CODE
  158.  
  159. SET_BADTRAK:
  160.     MOV    DH,AL
  161.     MOV    DL,BYTE PTR CS:[DR_ID]
  162.     XCHG    BH,BL
  163.     MOV    CX,6
  164.     SHL    BL,CL
  165.     ADD    BX,1
  166.     MOV    CX,BX
  167.     MOV    AX,601H
  168.     INT    13H
  169.     RET
  170.  
  171. GETNUM:
  172.     mov    cl,30H
  173.     mov    ch,cl
  174.     mov    dx,cx
  175.     mov    bl,0
  176. GETNUM00:
  177.     mov    ah,1
  178.     int    21H
  179.     cmp    al,0DH
  180.     jnz    GETNUM01
  181.     cmp    bl,0
  182.     jnz    GETNUM07
  183.     mov    ch,2
  184.     ret    
  185.  
  186. GETNUM01:
  187.     cmp    al,8
  188.     jz    GETNUM05
  189.     inc    bl
  190.     cmp    bl,4
  191.     ja    GETNUM02
  192.     mov    dh,dl
  193.     mov    dl,ch
  194.     mov    ch,cl
  195.     mov    cl,al
  196.     jmp    GETNUM00
  197. GETNUM02:
  198.     mov    bh,0
  199. GETNUM03:
  200.     mov    dl,8
  201.     mov    ah,2
  202.     int    21H
  203.     dec    bl
  204.     cmp    bl,0
  205.     jnz    GETNUM03
  206.     cmp    bh,1
  207.     jz    GETNUM
  208. GETNUM04:
  209.     mov    dl,20H
  210.     mov    ah,2
  211.     int    21H
  212.     inc    bl
  213.     cmp    bl,4
  214.     jbe    GETNUM04
  215.     inc    bh
  216.     jmp    GETNUM03
  217. GETNUM05:
  218.     push    dx
  219.     mov    dl,20H
  220.     mov    ah,2
  221.     int    21H
  222.     cmp    bl,0
  223.     jz    GETNUM06
  224.     mov    dl,8
  225.     mov    ah,2
  226.     int    21H
  227.     pop    dx
  228.     mov    cl,ch
  229.     mov    ch,dl
  230.     mov    dl,dh
  231.     mov    dh,30      ;"0"
  232.     dec    bl
  233.     jmp    GETNUM00
  234. GETNUM06:
  235.     pop    dx
  236.     jmp    GETNUM00
  237. GETNUM07:
  238.     mov    bl,0AH
  239.     mov    al,39H
  240.     cmp    cl,al
  241.     jg    GETNUM08
  242.     cmp    ch,al
  243.     jg    GETNUM08
  244.     cmp    dl,al
  245.     jg    GETNUM08
  246.     cmp    dh,al
  247.     jg    GETNUM08
  248.     mov    al,30H
  249.     sub    cl,al
  250.     jc    GETNUM08
  251.     sub    ch,al
  252.     jc    GETNUM08
  253.     sub    dl,al
  254.     jc    GETNUM08
  255.     sub    dh,al
  256.     jc    GETNUM08
  257.     mov    al,dh
  258.     mov    ah,0
  259.     mul    bl
  260.     mov    dh,0
  261.     add    ax,dx
  262.     mul    bl
  263.     mov    dl,ch
  264.     add    ax,dx
  265.     mul    bl
  266.     mov    dl,cl
  267.     add    ax,dx
  268.     mov    ch,0
  269.     ret    
  270. GETNUM08:
  271.     mov    ch,2
  272.     ret    
  273.  
  274.  
  275. PRTDX:    PUSH    DS
  276.     MOV    AX,CS
  277.     MOV    DS,AX
  278.     DISPLAY
  279.     POP    DS
  280.     RET    
  281.  
  282. RINGBELL:
  283.     MOV    DX,OFFSET [BELL]
  284.     CALL    PRTDX
  285.     RET    
  286.  
  287. BACK2:    
  288.     PUSH    AX
  289.     PUSH    BX
  290.     PUSH    DX
  291.     PUSH    SI
  292.     MOV    BH,0
  293.     MOV    AH,3    ; Get Cursor into DX
  294.     INT    10H
  295.     SUB    DL,2
  296.     MOV    AH,2    ; Set Cursor from DX
  297.     INT    10H
  298.     POP    SI
  299.     POP    DX
  300.     POP    BX
  301.     POP    AX
  302.     RET
  303.  
  304. GETANS:            ; Set DI to point to required ANS string
  305.     PUSH    ES
  306.     PUSH    SI
  307.     PUSH    BX
  308.     PUSH    CX
  309.     PUSH    DX
  310.     CLD
  311.     PUSH    CS
  312.     POP    ES
  313.     PUSH    DI
  314. G1:
  315.     POP    DI
  316.     PUSH    DI
  317.     MOV    AH,8
  318.     INT    21H
  319.     AND    AL,0DFH    ; Convert to Upper Case
  320.     MOV    CX,4
  321.     REPNZ    SCASB 
  322.     JNZ    G1
  323.     CMP    AL,0DH
  324.     JZ    G2
  325.     MOV    BH,0
  326.     MOV    CX,1
  327.     MOV    AH,0AH    ; Show Character
  328.     INT    10H
  329.     JMP    G1
  330. G2:
  331.     POP    DI
  332.     MOV    BH,0
  333.     MOV    AH,8    ; Get Character at Cursor
  334.     INT    10H
  335.     PUSH    AX
  336.     CALL    GETCURS
  337.     INC    DH
  338.     MOV    DL,2
  339.     CALL    SETCURS    ; to Next Line col 3
  340.     POP    AX
  341.     POP    DX
  342.     POP    CX
  343.     POP    BX
  344.     POP    SI
  345.     POP    ES
  346.     RET
  347.  
  348. GETCHARE:
  349.     MOV    AH,1
  350.     INT    21H
  351.     RET    
  352.  
  353. GETCHAR:
  354.     MOV    AH,8
  355.     INT    21H
  356.     RET    
  357.  
  358. GETCURS:
  359.     PUSH    CX
  360.     PUSH    AX
  361.     PUSH    BX
  362.     PUSH    SI
  363.     MOV    AH,3
  364.     MOV    BH,0
  365.     INT    10H
  366.     POP    SI
  367.     POP    BX
  368.     POP    AX
  369.     POP    CX
  370.     RET    
  371.  
  372. SETCURS:
  373.     PUSH    AX
  374.     PUSH    BX
  375.     PUSH    CX
  376.     PUSH    SI
  377.     MOV    AH,2
  378.     MOV    BH,0
  379.     INT    10H
  380.     POP    SI
  381.     POP    CX
  382.     POP    BX
  383.     POP    AX
  384.     RET    
  385.  
  386. GET_STATUS:
  387.     PUSH    AX
  388.     PUSH    DX
  389.     CALL    GET_PORT_OFFSET
  390.     IN    AL,DX
  391.     AND    AL,80H
  392.     CMP    AL,80H
  393.     POP    DX
  394.     POP    AX
  395.     RET    
  396.  
  397. GET_PORT_OFFSET:
  398.     PUSH    BX
  399.     MOV    BX,77H
  400.     MOV    BL,BYTE PTR [BX]
  401.     XOR    BH,BH
  402.     MOV    DX,322H
  403.     ADD    DX,BX
  404.     POP    BX
  405.     RET    
  406.  
  407. HEX2ASC:
  408.     push    bx
  409.     push    cx
  410.     push    dx
  411.     push    si
  412.     mov    bx,42H
  413.     mov    WORD PTR [bx],2020H
  414.     mov    WORD PTR [bx+02],2020H
  415.     mov    WORD PTR [bx+04],2020H
  416.     mov    bx,4
  417.     mov    cx,0AH
  418. CLRS1:
  419.     xor    dx,dx
  420.     div    cx
  421.     add    dl,30H      ;"0"
  422.     mov    si,42H
  423.     mov    [bx+si],dl
  424.     dec    bx
  425.     cmp    ax,0
  426.     jnz    CLRS1
  427.     pop    si
  428.     pop    dx
  429.     pop    cx
  430.     pop    bx
  431.     ret    
  432.  
  433. SET_STAT:
  434.     push    ax
  435.     push    dx
  436.     push    es
  437.     call    GET_PORT_OFFSET
  438.     in    al,dx
  439.     call    GET_STATUS
  440.     jc    STST
  441.     push    bx
  442.     mov    bx,43H
  443.     mov    ah,[bx]
  444.     pop    bx
  445.     and    ah,20
  446.     jz    STST
  447.     mov    cl,4
  448.     shr    al,cl
  449. STST:
  450.     mov    cl,4
  451.     and    al,7
  452.     shl    al,cl
  453.     xor    ah,ah
  454.     push    ax
  455.     push    ds
  456.     push    es
  457.     push    ax
  458.     mov    ax,0
  459.     mov    ds,ax
  460.     pop    ax
  461.     mov    bx,104H
  462.     push    ax
  463.     mov    ax,0
  464.     mov    es,ax
  465.     pop    ax
  466.     mov    bx,es:[bx]
  467.     pop    es
  468.     pop    ds
  469.     pop    ax
  470.     add    bx,ax
  471.     pop    es
  472.     pop    dx
  473.     pop    ax
  474.     ret    
  475.  
  476. SETBLANK:
  477.     mov    si,42H
  478.     mov    cx,5
  479. STB1:
  480.     mov    al,[si]
  481.     cmp    al,20H      ;" "
  482.     jnz    STB2
  483.     inc    si
  484.     dec    cx
  485.     jmp    STB1
  486. STB2:
  487.     ret    
  488.  
  489. SHOWNUM:
  490.     MOV    DL,[SI]
  491.     MOV    AH,2
  492.     INT    21H
  493.     INC    SI
  494.     LOOP    SHOWNUM
  495.     RET
  496.     
  497.  
  498. ;###
  499.  
  500. TIM_START:        ; Start Clock 
  501.     PUSH    AX
  502.     PUSH    DX
  503.     PUSH    DS
  504.     MOV    TIM_MICRO,0    ; Clear area for final results
  505.     MOV    TIM_MILLI,0    ;
  506.     MOV    TIM_SEC,0    ;
  507.     
  508.     ;Initialise counter 0 of 8253 chip
  509.      
  510.     MOV    AL,00110100B    ; Set mode for Counter 0
  511.     CLI
  512.     OUT    TIM_MODE,AL
  513.     SUB    AX,AX        ; Set Counter at Zero
  514.     OUT    TIM_0,AL    ; LSB
  515.     OUT    TIM_0,AL    ; MSB
  516.     MOV    DX,BIOS_DSEG    ; Read current setting of System Clock
  517.     MOV    DS,DX
  518.     MOV    AX,DS:[TIM_LOW]
  519.     STI
  520.     POP    DS
  521.     MOV    COUNT,AX    ; Save it
  522.     POP    DX        ; Restore Registers
  523.     POP    AX
  524.     RET
  525.  
  526. ; Elapsed timer since Timer start =
  527. ;    1) Timer count ticks @ 840 nSecs
  528. ;    2) Interrupt ticks @ 54 mSecs
  529.  
  530. TIM_STOP:        ; Stop Clock
  531.     PUSH    AX
  532.     PUSH    BX
  533.     PUSH    DX
  534.     MOV    AL,0        ; Ready to read 8253
  535.     CLI            ; Interrupts off until system clock read
  536.     OUT    TIM_MODE,AL    ; Set Mode for read
  537.     IN    AL,TIM_0    ; Read LSB
  538.     MOV    DL,AL        ; Save it
  539.     IN    AL,TIM_0    ; Read MSB
  540.     MOV    DH,AL        ; Save it
  541.     MOV    AX,COUNT_MAX
  542.     SUB    AX,DX        ; Timer Count Value
  543.     MUL    TIM_CONV    ; Make to tenths of a nanosecond
  544.     DIV    TEN_TH        ; Make to microseconds
  545.     MOV    TIM_MICRO,AX    ; Save it
  546.     CMP    DX,FIVE_TH    ; Round nanoseconds 
  547.     JB    CONT        ; Round down
  548.     INC    TIM_MICRO    ; Round up
  549. CONT:    MOV    DX,BIOS_DSEG
  550.     MOV    DS,DX
  551.     MOV    AX,DS:[TIM_LOW]    ; Collect System Clock reading
  552.     PUSH    CS
  553.     POP    DX        
  554.     MOV    DS,DX        ; Restore DS register
  555.     SUB    AX,COUNT    ; System ticks since start
  556.     MUL    COUNT_CONV    ; Make to thousandths of millisecond
  557.     DIV    THOU        ; Make to milliseconds
  558.     MOV    COUNT_MILLI,AX    ; Save millisecs
  559.     MOV    COUNT_MICRO,DX    ; Save microsecs
  560.     CMP    AX,0        ; Check for elapsed time less than 1 mSec
  561.     JNE    JIT        ; If not - no problem
  562.     MOV    AX,ADJUSTM    ; Compensation amount
  563.     CMP    TIM_MICRO,AX    ; Less than microseconds?
  564.     JAE    JIT        ; No - so OK
  565.     MOV    TIM_MICRO,AX    ; Yes so use compensation
  566.     
  567. JIT:    MOV    AX,DX        ; This is System Microsecs
  568.     ADD    AX,TIM_MICRO    ; Add Timer Microsecs
  569.     CMP    AX,ADJUSTM    ; any underflow?
  570.     JAE    COMP        ; No - so continue
  571.     DEC    COUNT_MILLI    ; Yes - so borrow
  572.     ADD    AX,1000    
  573. COMP:    SUB    AX,ADJUSTM    ; Apply compensation
  574.     MOV    TIM_MICRO,AX    
  575.     CMP    AX,1000        ; any overflow?
  576.     JB    FLDOK        ; No - so continue
  577.     SUB    DX,DX        ; TIM_MICRO too large!
  578.     DIV    THOU        ; so carry into TIM_MILLI
  579.     MOV    TIM_MILLI,AX
  580.     MOV    TIM_MICRO,DX
  581. FLDOK:    MOV    AX,COUNT_MILLI    ; Get System milliseconds
  582.     ADD    TIM_MILLI,AX    ; Add to timer milliseconds
  583.     CMP    TIM_MILLI,1000    ; any overflow
  584.     JB    QUIT        ; No - so continue
  585.     SUB    DX,DX        ; 
  586.     MOV    AX,TIM_MILLI    ; TIM_MILLI too large
  587.     DIV    THOU        ; so carry into TIM_SEC
  588.     MOV    TIM_SEC,AX    ; Save Seconds
  589.     MOV    TIM_MILLI,DX    ; Save Milliseconds
  590.  
  591. QUIT:    
  592.     POP    DX        ; Restore registers
  593.     POP    BX
  594.     POP    AX
  595.     RET
  596.  
  597. ;----------------------------------
  598. ;  Decode and Display Time readings
  599. ;----------------------------------    
  600. SHOW_AVE:
  601.     PUSH    AX
  602.     PUSH    BX
  603.     PUSH    DX
  604.     LEA    DX,MESS_AVE
  605.     JMP    SHOW0
  606. SHOW:
  607.     PUSH    AX        ; Save registers
  608.     PUSH    BX
  609.     PUSH    DX
  610.     LEA    DX,MESS_RUN    ; Display Seconds Message
  611. SHOW0:    CALL    PRTDX
  612.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  613.     MOV    AX,TIM_SEC    ; Get Value of Seconds
  614.     CALL    BIN2ASC        ; Convert from binary to ASCII
  615.     MOV    DX,BX        ; Transfer pointer
  616.     CALL    PRTDX            ; Display Seconds value
  617.     LEA    DX,MESS_MIL    ; Display Decimal point
  618.     CALL    PRTDX
  619.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  620.     MOV    AX,TIM_MILLI    ; Get Value of Milliseconds
  621.     CALL    BIN2ASC        ; Convert from binary to ASCII
  622.     LEA    DX,ASC_STR+2    ; Point to last three digits
  623.     CALL    PRTDX            ; Display Milliseconds Value
  624.     LEA    DX,MESS_MIC    ; Display comma
  625.     CALL    PRTDX
  626.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  627.     MOV    AX,TIM_MICRO    ; Get Value of Microseconds
  628.     CALL    BIN2ASC        ; Convert from binary to ASCII
  629.     LEA    DX,ASC_STR+2    ; Point to last three digits
  630.     CALL    PRTDX            ; Display Microseconds value
  631.     LEA    DX,MESS_SEC
  632.     CALL    PRTDX
  633.     POP    DX        ; Restore registers
  634.     POP    BX
  635.     POP    AX
  636.     RET
  637.  
  638. ;--------------------------------------------
  639. ;    Binary to ASCII conversion into ASC_STR
  640. ;--------------------------------------------
  641. ;    Value to be converted is passed in AX and written to ASC_STR
  642.  
  643. BIN2ASC:
  644.     PUSH    DX            ; Save registers
  645.     PUSH    CX
  646.     PUSH    AX
  647.     MOV    CX,5            ; Clear ASC_STR
  648. CLBUF:    MOV    BYTE PTR [BX],30H    ; Put zeroes in
  649.     INC    BX
  650.     LOOP    CLBUF
  651. CONV:    SUB    DX,DX            ; Clear upper half of dividend
  652.     DIV    TEN            ; = (DX:AX)/10
  653.     ADD    DX,30H            ; Convert to ASCII
  654.     DEC    BX            ; bump pointer
  655.     MOV    [BX],DL            ; Save digit
  656.     OR    AX,AX            ; Check if finished?
  657.     JNZ    CONV            ; No - go again!
  658.     POP    AX            ; Restore registers
  659.     POP    CX
  660.     POP    DX
  661.     RET
  662.  
  663. ;------------------------
  664. ;  CONVERT TIME TO ASCII
  665. ;-----------------------
  666.  
  667. TIM2ASC:
  668.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  669.     MOV    AX,TIM_SEC    ; Get Value of Seconds
  670.     CALL    BIN2ASC        ; Convert from binary to ASCII
  671.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  672.     MOV    AX,TIM_MILLI    ; Get Value of Milliseconds
  673.     CALL    BIN2ASC        ; Convert from binary to ASCII
  674.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  675.     MOV    AX,TIM_MICRO    ; Get Value of Microseconds
  676.     CALL    BIN2ASC        ; Convert from binary to ASCII
  677.     RET
  678. ;------------------------
  679. ;  MAIN CODE    XXXXX
  680. ;------------------------    
  681.     
  682.  
  683. START:
  684.     MOV    AX,600H
  685.     MOV    CX,0
  686.     MOV    DX,184FH
  687.     MOV    BH,1FH
  688.     INT    10H
  689.     MOV    DX,0
  690.     CALL    SETCURS    
  691.     LEA    DX,SIGN_ON    ; Display Sign-on Message
  692.     CALL    PRTDX        ; Prints frame
  693.     MOV    AH,01
  694.     INT    21H
  695.     MOV    AX,600H
  696.     MOV    CX,0302H
  697.     MOV    DX,164DH
  698.     MOV    BH,1FH
  699.     INT    10H
  700.     
  701.     MOV    AX,40H
  702.     MOV    DS,AX
  703.     MOV    AX,0        ; Reset Fixed Drive 1
  704.     MOV    DX,0
  705.     MOV    DL,80H
  706.     MOV    CX,1
  707.     INT    13H
  708.     MOV    DX,0402H
  709.     CALL    SETCURS
  710.     MOV    AH,14H        ; Controller Diagnostics
  711.     MOV    DL,80H
  712.     INT    13H
  713.     JNC    START1
  714.     LEA    DX,DUFF_CONT    ; Controller Faulty
  715.     CALL    PRTDX
  716. QQQ:
  717.     LEA    DX,ABORT
  718.     CALL    PRTDX
  719.     MOV    AX,4C01H
  720.     INT    21H        ; END
  721. ;==========================  
  722. START1:
  723.  
  724.     PUSH    CS
  725.     POP    DS
  726.     CLI
  727.     CALL    TIM_START    ; Start the Clock
  728.     CALL    TIM_STOP    ; Stop the Clock
  729.     STI
  730.     MOV    DX,TIM_MICRO    ; Read elapsed time (overhead)
  731.     MOV    ADJUSTM,DX    ; Save as compensation factor
  732.  
  733.     LEA    DX,MESS_01    ; Show Warning Message
  734.     CALL    PRTDX
  735.     CALL    BACK2
  736.     LEA    DI,ANSYN
  737.     CALL    GETANS
  738.     CMP    AL,'Y'
  739.     JZ    DRSEL        ; Answer was 'Y'
  740.     JMP    QQQ
  741. DRSEL:        
  742.     MOV    AX,40H
  743.     MOV    DS,AX
  744.     MOV    BX,75H        ; How many H Disks?
  745.     CMP    BYTE PTR [BX],2 
  746.     JZ    DRSEL01        ; 2 Drives so Select
  747.     MOV    AL,0        ; 1 Drive so Jump
  748.     JMP    SRSEL03 
  749. DRSEL01:
  750.     CALL    GET_STATUS
  751.     JC    DRSEL02        ; Logical Partitioning Set Up
  752.     JMP    SRSEL01
  753. DRSEL02:
  754.     LEA    DX,LOG_PART
  755.     CALL    PRTDX
  756.     JMP    QQQ
  757.  
  758. SRSEL01:
  759.     LEA    DX,SELECT1
  760.     CALL    PRTDX
  761.     CALL    BACK2
  762.     LEA    DI,ANSCD
  763.     CALL    GETANS
  764.     CMP    AL,'C'
  765.     JZ    SRSEL02
  766.     MOV    AL,0
  767.     MOV    BYTE PTR CS:[DR_ID],81H
  768.     MOV    BYTE PTR CS:[MESS_OPT4],44H
  769.     JMP    SRSEL03
  770. SRSEL02:
  771.     MOV    AL,20H
  772. SRSEL03:
  773.     MOV    BX,43H
  774.     MOV    [BX],AL
  775.     call    GET_STATUS
  776.     jnc    DRREP1
  777.     mov    bx,43H
  778.     cmp    BYTE PTR [BX],60H
  779.     jz    DRREP1
  780.     JMP    DRSEL02
  781. DRREP1:
  782.     LEA    dx,DR_REPP
  783.     call    PRTDX
  784.     call    SET_STAT
  785.     MOV    AX,800H
  786.     MOV    DX,0
  787.     MOV    DL,BYTE PTR CS:[DR_ID]
  788.     INT    13H            ;CH=62H  CL=1 0010001
  789.     INC    DH
  790.     MOV    CS:[HDS],DH        ; Number of Heads
  791.     MOV    AX,CX
  792.     MOV    CX,6
  793.     SHR    AL,CL
  794.     XCHG    AH,AL
  795.     ADD    AX,2
  796.     MOV    CS:[CYLS],AX
  797.     PUSH    AX
  798.     LEA    DX,DR_CYL
  799.     CALL    PRTDX
  800.     POP    AX
  801.     CALL    HEX2ASC    
  802.     CALL    SETBLANK
  803.     CALL    SHOWNUM
  804.     LEA    DX,LF
  805.     CALL    PRTDX
  806.     LEA    DX,DR_HDS
  807.     CALL    PRTDX
  808.     SUB    AX,AX
  809.     MOV    AL,CS:[HDS]
  810.     CALL    HEX2ASC    
  811.     CALL    SETBLANK
  812.     CALL    SHOWNUM
  813.     CALL    GETCURS
  814.     INC    DH
  815.     INC    DH
  816.     MOV    DL,2
  817.     CALL    SETCURS
  818.     LEA    DX,CONFIRM
  819.     CALL    PRTDX
  820.     CALL    BACK2
  821.     LEA    DI,ANSYN
  822.     CALL    GETANS
  823.     CMP    AL,'Y'
  824.     JZ    FMTCMD0
  825.     JMP    QQQ
  826. FMTCMD0:
  827.     LEA    DX,MESS_OPT0
  828.     CALL    PRTDX
  829.  
  830. FMTCMD:
  831.     PUSH    CS
  832.     POP    DS
  833.     MOV    CX,2        ; Two Tracks to FORMAT
  834. FMTRAKS:
  835.     PUSH    CX        ; Save track count
  836.     MOV    AL,CL        ; Use it to mark Track
  837.     DEC    AL
  838.     MOV    CX,4        ; Four Heads to use
  839. FMTRAK:
  840.     PUSH    CX        ; Save Head Count
  841.     PUSH    AX        ; Save Track indicator
  842.     MOV    DH,CL        ; Set Head number
  843.     DEC    DH
  844.     MOV    CH,AL        ; CYL NO.
  845.     MOV    AH,05H        ; Format command
  846.     MOV    AL,BYTE PTR [INTERLEAVE]
  847.     MOV    BX,OFFSET DTABUF
  848.     MOV    CL,1        ; SECT=1
  849.     MOV    DL,BYTE PTR [DR_ID]    ; Drive
  850.     INT    13H
  851.     POP    AX
  852.     POP    CX
  853.     LOOP    FMTRAK
  854.     POP    CX
  855.     LOOP    FMTRAKS
  856.  
  857. ;--------------------------------------------------
  858. ; Each of the following loops sets the Disk Head to a position,
  859. ; Starts the clock, resets the Disk Head and then stops the clock.
  860. ; The subsequent time is then converted and displayed.
  861. ;--------------------------------------------------
  862. ; This runs the Disk test routine 8 times and places the
  863. ; successive results in TIM1 to TIM8 Data Words
  864. ;--------------------------------------------------
  865.  
  866.     IRP    ?X,<1,2,3,4>
  867.     HEADSET    0,0    
  868.     CLI
  869.     CALL    TIM_START
  870.     HEADSET    3,310
  871.     CALL    TIM_STOP
  872.     STI
  873.     CALL    TIM2ASC
  874.     MOV    SI,OFFSET TIM_MICRO
  875.     MOV    DI,OFFSET TIM&?X&MIC
  876.     MOV    CX,6
  877.     REP    MOVSB
  878.     ENDM
  879.  
  880. ;--------------------------------------------------
  881. ; Now we must average out the 8 test results obtained
  882. ; and put the answer back into TIM_MICRO +++
  883. ;--------------------------------------------------
  884.  
  885.     SUB    AX,AX            ; Clear AX for addition
  886.     
  887.     IRP    ?X,<1,2,3,4>
  888.     ADD    AX,DS:[TIM&?X&MIC]
  889.     ENDM
  890.  
  891.     MOV    TIM_MICRO,AX
  892. ;--------------------------------------------------
  893.  
  894.     SUB    AX,AX            ; Clear AX for addition
  895.     
  896.     IRP    ?X,<1,2,3,4>
  897.     ADD    AX,DS:[TIM&?X&MIL]
  898.     ENDM
  899.  
  900.     MOV    TIM_MILLI,AX
  901. ;--------------------------------------------------
  902.  
  903.     SUB    AX,AX            ; Clear AX for addition
  904.     
  905.     IRP    ?X,<1,2,3,4>
  906.     ADD    AX,DS:[TIM&?X&SEC]
  907.     ENDM
  908.  
  909.     MOV    DX,0
  910.     MUL    THOU
  911.     ADD    AX,[TIM_MILLI]
  912.     JNC    NEXT1
  913.     INC    DX
  914. NEXT1:
  915.     MUL    THOU
  916.     ADD    AX,[TIM_MICRO]
  917.     JNC    NEXT2
  918.     INC    DX
  919. NEXT2:
  920.     SHR    DX,1
  921.     RCR    AX,1
  922.     SHR    DX,1
  923.     RCR    AX,1
  924.             ; Now DX:AX contains binary number of Microsecs
  925.     DIV    THOU
  926.     MOV    [TIM_MICRO],DX
  927.     XOR    DX,DX
  928.     DIV    THOU
  929.     MOV    [TIM_MILLI],DX
  930.     MOV    [TIM_SEC],AX        
  931.  
  932.     CMP    [LOWSEC],AX
  933.     JC    LBL2
  934.     CMP    [LOWMIL],DX
  935.     JC    LBL2
  936.     MOV    [LOWMIL],DX
  937.     MOV    [LOWSEC],AX
  938.     MOV    AX,WORD PTR [INTERLEAVE]
  939.     MOV    WORD PTR [INTLVE],AX
  940. LBL2:    
  941.     MOV    AL,BYTE PTR [INTERLEAVE]
  942.     AAM
  943.     OR    AX,3030H
  944.     XCHG    AH,AL
  945.     MOV    WORD PTR [MESS_EQ],AX
  946.     CALL    GETCURS
  947.     PUSH    DX
  948.     LEA    DX,MESS_RUN    ; Display Seconds Message
  949.     CALL    PRTDX
  950.     CALL    SHOW_AVE        ; Display Average time
  951.     POP    DX
  952.     CALL    SETCURS
  953.     DEC    BYTE PTR [INTERLEAVE]
  954.     JZ    FINISH
  955.     JMP    FMTCMD
  956. FINISH:
  957.     CALL    GETCURS
  958.     MOV    DL,2
  959.     CALL    SETCURS
  960.     LEA    DX,BLANKLINE
  961.     CALL    PRTDX
  962.     CALL    GETCURS
  963.     MOV    DL,2
  964.     CALL    SETCURS
  965.     MOV    AL,BYTE PTR [INTLVE]
  966.     AAM
  967.     OR    AX,3030H
  968.     XCHG    AH,AL
  969.     MOV    WORD PTR [MESS_OPT2],AX
  970.     LEA    DX,MESS_OPT1        ; Display IntLve Message
  971.     CALL    PRTDX
  972.     CALL    GETCURS
  973.     INC    DH
  974.     MOV    DL,2
  975.     CALL    SETCURS
  976.     LEA    DX,MESS_OPT3
  977.     CALL    PRTDX
  978.     LEA    DX,MESS_OPT2
  979.     CALL    PRTDX    
  980.     MOV    AL,BYTE PTR [INTLVE]
  981.     MOV    DH,0
  982.     MOV    DL,BYTE PTR [DR_ID]
  983.     MOV    CX,1
  984.     MOV    AH,7
  985.     INT    13H        ; Drive Formatted HERE
  986.     CALL    GETCURS
  987.     MOV    DL,2
  988.     DEC    DH
  989.     CALL    SETCURS
  990.     LEA    DX,MESS_OPT9    ; Format Complete
  991.     CALL    PRTDX
  992. TEST:
  993.     LEA    DX,MESS_OPT5    ; Bad Tracks? N       Line 1
  994.     CALL    PRTDX
  995.     CALL    BACK2
  996.     LEA    DI,ANSYN
  997.     CALL    GETANS
  998.     CMP    AL,'Y'
  999.     JZ    BAD_TRAKS00
  1000.     JMP    QQQ1
  1001.  
  1002. BAD_TRAKS00:
  1003.     CALL    GETCURS
  1004.     MOV    DL,2
  1005.     CALL    SETCURS
  1006.     LEA    DX,MESS_OPT6    ; Enter Track        Line 2
  1007.     CALL    PRTDX
  1008.     CALL    GETNUM    
  1009. ; TEST AX FOR VALID CYLINDER
  1010.     CMP    AX,WORD PTR CS:[CYLS]
  1011.     JC    CYLOK
  1012.     CALL    RINGBELL
  1013.     LEA    DX,BADCYL
  1014.     CALL    PRTDX
  1015.     CALL    GETCURS
  1016.     DEC    DH
  1017.     MOV    DL,2
  1018.     CALL    SETCURS
  1019.     LEA    DX,BLANKLINE
  1020.     CALL    PRTDX
  1021.     JMP    BAD_TRAKS00
  1022. CYLOK:    
  1023.     push    ax
  1024. CYLOK1:
  1025.     CALL    GETCURS
  1026.     INC    DH
  1027.     MOV    DL,2
  1028.     CALL    SETCURS
  1029.     LEA    DX,MESS_OPT7    ; Enter Head        Line 3
  1030.     CALL    PRTDX
  1031.     CALL    GETNUM
  1032. ; TEST AX FOR VALID HEAD NUMBER    
  1033.     CMP    AL,BYTE PTR CS:[HDS]
  1034.     JC    HDOK
  1035.     CALL    RINGBELL
  1036.     LEA    DX,BADHD
  1037.     CALL    PRTDX
  1038.     CALL    GETCURS
  1039.     DEC    DH
  1040.     MOV    DL,2
  1041.     CALL    SETCURS
  1042.     LEA    DX,BLANKLINE
  1043.     CALL    PRTDX
  1044.     CALL    GETCURS
  1045.     DEC    DH
  1046.     MOV    DL,2
  1047.     CALL    SETCURS
  1048.     JMP    CYLOK1
  1049. HDOK:
  1050. ; AX HAS HEAD NUMBER, STACK HAS CYLINDER NUMBER
  1051. ; FORMAT BAD TRACK
  1052.     POP    BX
  1053.     CALL    SET_BADTRAK
  1054.     CALL    GETCURS
  1055.     INC    DH
  1056.     MOV    DL,2
  1057.     CALL    SETCURS
  1058.     LEA    DX,MESS_OPT8    ; Track Flagged - MORE?   Line 4
  1059.     CALL    PRTDX
  1060.     CALL    BACK2
  1061.     LEA    DI,ANSYN
  1062.     CALL    GETANS
  1063.     CMP    AL,'Y'
  1064.     JZ    BAD_TRAKS01
  1065.     JMP    QQQ1
  1066.  
  1067. BAD_TRAKS01:
  1068.     CALL    GETCURS
  1069.     MOV    DL,2
  1070.     MOV    CX,5
  1071.  
  1072. BAD_TRAKS02:    
  1073.     PUSH    CX
  1074.     CALL    SETCURS
  1075.     LEA    DX,BLANKLINE
  1076.     CALL    PRTDX
  1077.     CALL    GETCURS
  1078.     DEC    DH
  1079.     MOV    DL,2
  1080.     POP    CX
  1081.     LOOP    BAD_TRAKS02
  1082.     CALL    GETCURS
  1083.     MOV    DL,2
  1084.     CALL    SETCURS
  1085.     LEA    DX,MESS_OPT10
  1086.     CALL    PRTDX
  1087.     JMP    BAD_TRAKS00
  1088. QQQ1:
  1089.     LEA    DX,CONTINUE
  1090.     CALL    PRTDX
  1091. ; set up variables in BOOT_TRAK buffer and DX before writing Partition Table
  1092.  
  1093.     DEC    CYLS
  1094.     DEC    CYLS
  1095.     MOV    AX,[CYLS]
  1096.     MOV    CX,6
  1097.     SHL    AH,CL
  1098.     OR    AH,11H
  1099.     XCHG    AH,AL
  1100.     MOV    [XSECTS],AX    
  1101.     INC    CYLS
  1102.     MOV    AL,44H
  1103.     CBW
  1104.     MUL    CYLS
  1105.     SUB    AX,11H
  1106.     MOV    XSEC_END,AX
  1107.     MOV    AX,301H
  1108.     MOV    BX,OFFSET BOOT_TRAK
  1109.     MOV    DX,0
  1110.     MOV    DL,BYTE PTR [DR_ID]
  1111.     MOV    CX,1
  1112.     INT    13H
  1113.  
  1114.     MOV    AX,40H
  1115.     MOV    DS,AX
  1116.     INT    19H        ; Terminate program and Reboot
  1117.  
  1118. BOOT_TRAK:
  1119.     DB    0EBH,74H,90H,49H,6EH,76H,61H,6CH,69H,64H
  1120.     DB    20H,70H,61H,72H,74H,69H,74H,69H,6FH,6EH
  1121.     DB    20H,74H,61H,62H,6CH,65H,20H,6FH,6EH,20H
  1122.     DB    66H,69H,78H,65H,64H,20H,64H,69H,73H,6BH
  1123.     DB    0DH,0AH,00H,4EH,6FH,20H,6FH,70H,65H,72H
  1124.     DB    61H,74H,69H,6EH,67H,20H,73H,79H,73H,74H
  1125.     DB    65H,6DH,20H,6FH,6EH,20H,66H,69H,78H,65H
  1126.     DB    64H,20H,64H,69H,73H,6BH,0DH,0AH,00H,45H
  1127.     DB    72H,72H,6FH,72H,20H,6CH,6FH,61H,64H,69H
  1128.     DB    6EH,67H,20H,73H,79H,73H,74H,65H,6DH,20H
  1129.     DB    66H,72H,6FH,6DH,20H,66H,69H,78H,65H,64H
  1130.     DB    20H,64H,69H,73H,6BH,0DH,0AH,00H,0FAH,0FCH
  1131.     DB    33H,0C0H,8EH,0D8H,8EH,0C0H,8EH,0D0H,0BCH,00H
  1132.     DB    7CH,0BEH,00H,7CH,0BFH,00H,7EH,0B9H,00H,02H
  1133.     DB    0F3H,0A4H,0B8H,0E0H,07H,50H,0B8H,97H,00H,50H
  1134.     DB    0CBH,0FBH,0BFH,03H,00H,0BBH,0BEH,7FH,0B9H,04H
  1135.     DB    00H,2BH,0F6H,80H,3FH,00H,74H,0BH,80H,3FH
  1136.     DB    80H,75H,12H,0BH,0F6H,75H,0EH,8BH,0F3H,83H
  1137.     DB    0C3H,10H,0E2H,0EBH,0BFH,2BH,00H,0BH,0F6H,75H
  1138.     DB    03H,0EBH,2BH,90H,8BH,14H,8BH,4CH,02H,0BBH
  1139.     DB    00H,7CH,0BDH,03H,00H,0B0H,01H,0B4H,02H,0CDH
  1140.     DB    13H,73H,09H,4DH,75H,0F5H,0BFH,4FH,00H,0EBH
  1141.     DB    0FH,90H,0BFH,2BH,00H,81H,0BFH,0FEH,01H,55H
  1142.     DB    0AAH,75H,03H,1EH,53H,0CBH,2EH,8AH,05H,47H
  1143.     DB    3CH,00H,74H,09H,0BBH,07H,00H,0B4H,0EH,0CDH
  1144.     DB    10H,0EBH,0EFH,0EBH,0FEH
  1145.     DB    239 DUP (0)
  1146.     DB    80H,01H,01H,00H,04H,03H
  1147.  
  1148. XSECTS        DW    6291H
  1149.         DB    11H,00H,00H,00H
  1150. XSEC_END    DW    0A23BH
  1151.         DB    00H,00H,55H,0AAH
  1152.     
  1153. DTABUF    DW    4 DUP (?)
  1154.  
  1155.  
  1156.  
  1157. MAIN    ENDP
  1158. CODE    ENDS
  1159. END    BEGIN
  1160.             
  1161.         
  1162.  
  1163.